--- title: "18-鱼友真实面经(2) - API 开放项目项目教程 - 编程导航教程" created: 2025-12-02 tags: - 项目 aliases: - 鱼友真实面经(2) - API 开放项目项目教程 - 编程导航教程 --- # 鱼友真实面经(2) - API 开放项目项目教程 - 编程导航教程 > 编程导航 - reflux 下面是面试过程中遇到的一些比较有用的题: ### 项目相关: 我做了三个项目,API、聚合搜索、点评 其中点评就是为了让面试官问我Redis相关的问题,这些网上八股一大堆,卷就完事了。 聚合搜索就负责告诉面试官我懂一点ES和设计模式,能把实现的思路说通就行。 场景题基本都是针对API来问的,招架不住,复盘的时候有了一些思路,希望能给大伙一点启发。 做完这三个项目,需要掌握你用到的技术栈,比如ES、sentinel、dubbo、rabbitMQ等等,使用、基本原理、容错、杂七杂八。然后如果实习了,就换上实习的真项目,结合工作经历,再面对场景题应该会得心应手一点。 ### 八股方面: 推荐多搜集些优秀的八股作者,小林、JavaGuide、竹子爱熊猫、《对线面试官》、廖雪峰、小白Debug、极客时间、黑马等等。每个作者都有擅长的领域,写得好的领域,针对性的看,不然可能会出现由于作者精力有限,某个八股题目写的比较简单,导致面试时被问穿,那么就会被打上深度不够的标签,还是很伤的。 ### 建议: 但,也不要有太大心理压力,朋友们,完成比完美更重要!如果不能记下完美的答案,那至少要记下基本的答案。不要让完美主义影响你的完成速度,这是血的教训哇。 鱼皮的项目多多梳理,有一段时间我还是很怀疑鱼皮项目的含金量的,在什么地方能胜过别人的项目?朋友们,含金量是够够的,不要急着否定,当你觉得你的想法更好时,去实践,如果发现自己只是异想天开、钻牛角尖的时候,就会知道项目的含金量,至少应付实习应该是够的,放心做。 当然,不乏真的有更好的想法,星球里的大佬不是也把自己的实现发出来了吗?去学,去借鉴就好了。自己完成了新的想法之后,开源出来,接收群众的拷打也是不错的方式。鱼皮之后也会走开源的路,大伙就不用自己从0整合扩展项目了,而是可以在前人的基础上扩展,还能学到多人合作的一些规范,感觉很不错。 ## **根据项目问技术栈** ### **1、一条es语句的执行流程** 最好说到分片规则、分布式存储、分布式查询的流程 分布式新增: ![[K88onW8sBsG8olxG-9918f586.webp]] 解读: 1. 1)新增一个id=1的文档 2. 2)对id做hash运算,假如得到的是2,则应该存储到shard-2 3. 3)shard-2的主分片在node3节点,将数据路由到node3 4. 4)保存文档 5. 5)同步给shard-2的副本replica-2,在node2节点(别忘了备份数据!) 6. 6)返回结果给coordinating-node节点 分布式查询: 1. scatter phase:分散阶段,coordinating node会把请求分发到**每一个**分片 2. gather phase:聚集阶段,coordinating node汇总data node的搜索结果,并处理为最终结果集返回给用户 为什么要把请求分发到每一个分片?因为查询的时候不是用id查,而是用关键字查,根本不知道数据在哪个分片,只能全查。通过协调节点,ES集群对外一致,不管查哪个节点都能查出来。 ### **2、dubbo怎么实现负载均衡** 查看:[负载均衡 | Apache Dubbo](https://cn.dubbo.apache.org/zh-cn/overview/core-features/load-balance/) 最好可以把一致性哈希的原理讲清楚:[9.4 什么是一致性哈希? | 小林coding](https://xiaolincoding.com/os/8_network_system/hash.html) ### **3、单边快排如何实现** 1. 双边快排怎么实现也说一下 2. 有几种选择基准值的办法?哪种最好 3. 怎么优化 4. 非递归怎么写 我的总结有点长,大伙可以直接看我参考的一些文章。 参考1:[排序算法杂谈(四) —— 快速排序的非递归实现 - Gerrard\_Feng - 博客园 (]([https://www.cnblogs.com/jing-an-feng-shao/p/9118376.html#:~:text=快速排序非递归的过程](https://www.cnblogs.com/jing-an-feng-shao/p/9118376.html#:~:text=%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E9%9D%9E%E9%80%92%E5%BD%92%E7%9A%84%E8%BF%87%E7%A8%8B) 快速排序非递归的执行过程中,只需要一个堆栈空间,其运行过程如下: 对原数组进行一次划分,分别将左边的 Record 和 右边的 Record,入栈 stack。 判断 stack 是否为空,若是,直接结束;若不是,将栈顶 Record 取出,进行一次划分。)[cnblogs.com](http://cnblogs.com/)[)]([https://www.cnblogs.com/jing-an-feng-shao/p/9118376.html#:~:text=快速排序非递归的过程](https://www.cnblogs.com/jing-an-feng-shao/p/9118376.html#:~:text=%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E9%9D%9E%E9%80%92%E5%BD%92%E7%9A%84%E8%BF%87%E7%A8%8B) 快速排序非递归的执行过程中,只需要一个堆栈空间,其运行过程如下: 对原数组进行一次划分,分别将左边的 Record 和 右边的 Record,入栈 stack。 判断 stack 是否为空,若是,直接结束;若不是,将栈顶 Record 取出,进行一次划分。) 参考2:[快速排序算法优化(基准选取、快速+插入、基数聚集)\_快速排序 基准数选取优化-CSDN博客](https://blog.csdn.net/qq_42642142/article/details/106950905) ### **4、dubbo底层怎么进行rpc调用** Dubbo框架的工作流程如下: 1. 服务提供者启动时,向注册中心注册自己提供的服务。 2. 服务消费者启动时,向注册中心订阅自己所需的服务。 3. 注册中心返回可用的服务地址列表给消费者。 4. 消费者通过负载均衡算法选择一个服务地址,并向该地址发起调用请求。 5. 服务提供者接收到请求后,根据请求参数执行相应的业务逻辑,并将结果返回给消费者。 现在还是不知道怎么回答,上面是GPT说的,也就是dubbo的那张经典的流程图。 ![[hNbzoh2tnnTRWZh8-3d7fb705.webp]] 我倾向于回答动态代理模式+RPC的调用流程: 1. 在 RPC 框架中,代理可以完成序列化、网络 I/O 操作、负载均衡、故障恢复以及服务发现等一系列操作,而上层调用方只感知到了**一次**本地调用 2. Client 首先会调用本地的代理。 3. Client 端 Proxy 会按照协议(Protocol),将调用中传入的数据序列化成字节流。 4. 之后 Client 会通过网络(Netty框架),将字节数据发送到 Server 端。 5. Server 端接收到字节数据之后,会按照协议进行反序列化,得到相应的请求信息。 6. Server 端 Proxy 会根据序列化后的请求信息,调用相应的业务逻辑。 7. Server 端业务逻辑的返回值,也会按照上述逻辑返回给 Client 端。 ![[U3cGd5YJsSkrR0me-59432073.webp]] ### **5、一个对象创建的流程** 1. 最好能接着说类加载机制 2. 最好能说出创建对象有几种方式 3. 反射 4. 序列化 5. unsafe类 6. 实现Cloneable接口重写clone方法 ### **6、sentinel一些原理** 1. 三种限流模式 2. 整体框架 3. 熔断降级怎么做 4. 和Hystrix的区别有哪些 呵呵呵呵,以上只是某家厂的一面,那时候才8月底,对青涩的我来说,简直难死了。 ## 拷打聚合搜索+黑马点评 1、说说聚合搜索平台的实现 2、ES集群怎么搭建? 3、布隆过滤器怎么解决冲突,能删数据吗?(不能) 4、RabbitMQ的原理,怎么实现消息顺序性 5、RabbitMQ怎么负载均衡 6、ZSET底层实现 7、JUC的大部分内容 这场比较常规,顺利通过了。 ## 拷打API 1、为什么不考研 2、dubbo3.0和dubbo2.0最大的区别是什么:[Dubbo3 应用级服务发现 | Apache Dubbo](https://cn.dubbo.apache.org/zh-cn/blog/2021/06/02/dubbo3-%E5%BA%94%E7%94%A8%E7%BA%A7%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0/) 3、dubbo注册时会注册什么数据上去? 4、nacos为什么对于临时实例采用心跳检测,非临时实例采用主动询问? 5、你把nacos同时作为配置中心和注册中心,知道这样有什么坏处不? 6、测试过nacos的并发注册能力吗?为什么nacos能抗住那么高注册? 7、元空间会GC吗? 8、元空间存储哪些数据? 9、垃圾回收器,问了很多 10、JVM调优 其中第四点,面试官告诉我他们测试了之后,区别不大 第6点,当时我记得黑马说能抗10w+,但是面试官告诉我,实际测试并没有那么高。 哈哈,在大佬面前,学生是不是背八股,痕迹还是很明显的,大伙尽量结合着自己的实践说,没实践过就谨慎点。 ## 八股 1、项目介绍 2、微服务的优点 3、Spring默认使用的容器是什么?tomcat的连接数了解吗? 4、Redis的Zset说说特性,底层实现(因为简历上写着,所以经常被问) 5、什么数据需要保存到Redis里? 6、缓存的缺点?怎么进行数据同步? 7、AOP失效的场景有哪些? 8、MySQL主键采用什么结构?为什么要自增,为什么要用int? 9、手撕,16min,小卡壳。 ## 手撕 为什么全是手撕?面了一个小时。 1、手撕单例,记得五种,写到第四种说不用写了。 2、手撕插入排序变种(根据题意) 3、给二叉树中序后序遍历,建二叉树 4、矩阵旋转(力扣原题) ## 场景题 面了1个小时,基本都是场景题+两道题,不好描述场景。 1、skywalking监控调用链时怎么区分不同实例?怎么传递上下文? 2、Java的序列化有哪几种方式,dubbo的序列化了解吗?你还了解哪些序列化 3、手撕了两题,一道sql,一道力扣mid,具体忘记是什么了。 Java自带序列化、Protocol Buffer、Hessian、JSON、XML,都谈谈吧。 ## 一些场景题(我太不会,欢迎补充): 回答基本是鱼皮的,我不会,我是彩笔 1、AK/SK怎么做的?你SDK是公开的吗?签名算法公开?这会出现什么问题,现在你能想出更好的解决办法吗? 1. 答:SDK是公开的吗?签名算法公开?当然可公开,不然开发者怎么用,只要秘钥不泄露,就没问题(我被诈了应该) 2、你的注册器模式,需要把Bean对象放入map里对吧?你怎么知道有多少个bean要放入map中?直接改代码吗?你能实现在线可插拔吗?根据需要加Bean进map里 1. 答:反射、或者通过监听配置的变更来更改 map 内的值(分布式配置中心) 3、你在面试,女朋友在自习,任何一人完成手头的事后都可以先去饭店,现在要求你和女朋友晚上同时吃饭,你和女朋友都是单线程的,请问怎么保证不会有人先吃完饭,而是同时吃? 1. 我的回答:使用消息队列,先到的人(比如女朋友)发送消息给消息队列,然后另一个人(我)完成手头的任务后就消费该消息,前往餐厅,女朋友设置回调函数,当我到达餐厅后,女朋友触发回调,就知道我到来了。 4、我们生成了一个随机数作为接口调用是否过期的判断,这个随机数是客户端生成的本地时间,本地时间可能出现不准确,怎么办? 1. 我的回答:每次都向服务端发起统一的请求,获得统一的时间 4.2、追问时间有偏差怎么办?我要很准确的时间。 1. 答:设置一个容错的窗口,在一定范围内的误差都可以忍受 4.3、追问每次都生成这个随机数太慢了,你有什么办法优化? 1. 答:缓存一些随机数 5、你的sdk怎么适配其他语言的项目?鱼皮的回答:鹅厂的做法是,一个语言一个sdk? ## 其他八股: 1、HTTPS的演变流程说一下,有几个版本?怎么建立连接的、流程是什么?用到了哪些非对称加密算法,对比一下它们,RSA怎么进行加密的、怎么生成随机数的?ECDHE为什么前向安全?具体的加密公式是什么 2、类上加static是为什么? 3、怎么优雅的中断一个线程? 4、Redis为什么一般用单库?分片集群下lua脚本有什么问题?什么时候会失效 10月22秋招基本结束,后面的面笔大部分都拒了,只面了三家还在流程中的比较大的厂。 ![[YyDSFi2gJsxFoelK-cd0c733f.webp]] ## 华为 一面50min: 1、手撕:Excel表字母列转对应数字列,也就是:26进制转10进制,10进制转26进制,0需要特判。 2、Spring里的核心配置是啥? 3、数据库三范式了解吗? 二面40min: 1、手撕:[反转链表 II](https://leetcode.cn/problems/reverse-linked-list-ii/) 三面30min: 表现得牛马一点就行了。 碎碎念:面的时候已经摆烂一个星期了,虽然很快就放我入池了,但难道其实一面就挂了?因为后面都没问啥难的,也没给我打保温电话,伤心。 ## 秋招倒数第二面: 1、Java的hashmap底层 2、红黑树的5个特点、怎么旋转保持这些特点? 3、红黑树的应用场景 4、为什么innoDB用B+树不用红黑树 5、三层B+树能存多少行数据? 6、这个存储量受每行数据大小影响吗? 7、联合索引如何实现? 8、命中主键索引和命中非主键索引有什么区别?(好吵阿,面试官那边,好像在居家办公?) 9、问了一些项目内容,给了一道场景题 nginx+网关集群提升网关吞吐量时,需要在nginx里配置网关ip和端口,请问你有什么办法上线一个节点下线一个节点自动知道它的ip?(不会,提示我有点类似nacos,然后就...或许会了) 10、口撕:n个升序列表,合并成一个升序列表。 没写过...尴尬 1. 1号链表和2号链表合并成新1号链表,新1号再和3号继续合并,以此类推。时间复杂度分析,优化 2. 突然发现有点像归并排序,说了一些归并的思路,时间复杂度分析,继续问有没有其他思路 3. 把所有节点保存在集合中,然后调用sort,比较暴力 4. 看我实在想不出,提示可以用优先队列...然后让我说了一下优先队列的思路 ## 秋招最后一面: 1、场景题:一次性调用多个接口,对于接口返回的data,怎么去组合?要求灵活易扩展,最好零代码 1. 这个刚好是面试官他们在解决的问题,提示我需要设置统一的规则。 2、RPC和HTTP对比?RPC有什么缺点? 3、netty是什么IO?底层框架说一下 4、场景题:异步解构时,有短板效应,怎么优化? 5、场景题:异步解构时,某些接口调用出现异常怎么办?(不会,没遇到过,现场想了一些) 1. 响应优先,就把异常接口的错误响应码和正常接口的正常数据打包返回,让用户决定是否使用这个数据 2. 异常接口重试,重试成功那就返回完整正确结果,多次重试还是失败,直接返回这次调用(包含多个接口调用)失败的响应码 6、追问:如果我需要出现异常调用,直接停止主线程,直接返回这次调用的失败响应码,怎么办? 1. 答:用消息队列,尽量让主线程自然停止,直接中断会出大问题。 7、设计模式几大原则 8、单一职责原则,有没有不需要遵守该原则的场景? 8.1、我说了一下我的理解:单体项目想要简单起见那可以这样搞,或者优化接口调用速度。但最好还是遵循这个原则,因为有利于项目扩展性。 8.2、然后面试官说了他的理解:这个单一原则并不是说只能做一件事,或最小化的事,这是一个抽象的概念,根据你的定义会改变,最重要的是接口的**可读性**是否统一,简单来说就是,一个接口里做了很多事,但接口的命名或者表达是否明确,这才是单一。提醒我不要太坚持教条化的原则 9、里氏替换原则,能出现父类的地方都能出现子类,但是继承是能改变父类的,比如重写,你怎么理解,这是否违背了里氏替换原则? 9.1、我的理解:比如RPC里用到的代理模式,要对父类增强的情况还是得遵循这个原则的,如果有需要多态的场景或许可以不遵守,根据需求而定。 9.2、面试官也给出了他的理解:这个原则还是很不错的,最好还是遵守,因为这个原则的基本条件是父类足够简单,足够抽象,父类能够被覆盖的只有抽象的部分,我们需要尽量区分父类能够覆盖和不能覆盖的部分。 最后三场面试还是很舒服的,整体偏向于沟通,不会的题也会尽量给出引导和提示,没有那种单纯你问我答的考试的感觉,也没有咄咄逼人高高在上的感觉。 面试的时候有个小诀窍,转移你的目标,比如我们面试,目标肯定是通过,但是这样压力就会很大,可能导致你发挥不好,真的不过的时候,还要emo。这时候转移你的目标,你是去学习,交流,进步的,这是个机会,这样想了之后,我的表现就自然了很多,不会的题就看看能不能从面试官嘴里问出点蛛丝马迹,,过不过,倒是次要的,压力就会小很多。祝大家以后面试都能遇到和善的氛围。 ## 简历 简历:上编程导航多看看别人的简历就可以了,就知道怎么写了。 我倾向的排版:个人资料—>教育背景(包括奖学金、比赛)—>项目—>技术栈 项目:照着鱼皮推荐的写就行了,项目有两个以上,每个写三四点就行了,只有一个那就写多点吧。 比赛和评奖评优因人而已,不相关的比赛也尽量放上去,HR面会问问,看看你的团队合作能力。 评奖评优那必须放呀,不然三年书白读了,绩点排名都放,当然要是不太好看就不放了。 社团活动、担任职位,我觉得放不放都可以,毕竟应聘的是技术岗。 我的简历,项目方面有很大的局限性,因为没实习,大伙实习后可以替换为实习的项目。 万事开头难,当我准备了一个半月,第一次写简历的时候,才发现,我还是啥也不会,非常胆怯,只敢写了解。 下面这个是我第一版简历,可以说非常搞笑了,你说你了解,可是到底了解了个啥?太空泛了。 这还是我看两遍星球的简历写法后写的,哈哈哈... ![[Dxe3Ylq3ZBMPQH0h-7f1785b1.webp]] 后面就是听从鱼皮建议,多看其他人的简历。当时我逛编程导航,大伙都很优秀,我随便挑了十来份,就挑到了哒哥的,问琴的,他俩做的项目和我一样,然后我就大概知道应该怎么写了。 技术栈,我觉得Java、JVM、JUC、Redis、MySQL,这五个一定得写?毕竟找工作一定会学。其他的就看后续的学习情况,比如我看了小林的计网,HTTPS整个流程还算熟悉,那自然要靠这个打动面试官。 提醒一下,朋友们,八股要经常复习,我摆了之后,下面有几个记得的,我也不确定了。 复习的话就多模拟面试,洗澡的时候自言自语,看看能不能把整个流程讲清楚。技术栈我比较倾向于写了解,比如IOC、AOP,之前我被问穿过一次,不敢写熟悉了。 最后,如果哪里写得有问题在评论区说一下吧,我自己由于灯下黑,找不出问题了。我的简历曾被某大厂面试官打为中等偏下水平,确实和鱼皮大学的简历比起来,略显狗屎,有中等偏下也不错了。轻喷。 ![[ma0lHFIYCA6JjRi5-4ec3c1ad.webp]] 附上鱼皮大学时的技术栈,那是真的一行顶我十行哈哈哈。 ![[Ftktf2w5TBoPHwxe-b2173371.webp]] 最后的最后,附上我参考最多的那一份简历,希望自己有天也能那么强: 给这个博主打个广告吧,稀土:竹子爱熊猫,相见恨晚,JUC、JVM讲得非常好,还是免费的,爽。 ![[FfL6NjJGIyqYFy7x-8644b11f.webp]] 感觉星球的md写起来不是很舒服,不过也整理了好久,希望对大伙有帮助吧。 --- **项目分区导航**:⬅️ [[17-鱼友真实面经(1) - API 开放项目项目教程 - 编程导航教程|17-鱼友真实面经(1) - API 开放项目项目教程 - 编程导航教程]] | 18-鱼友真实面经(2) - API 开放项目项目教程 - 编程导航教程 | ➡️ [[19-API 开放平台问题答疑 - API 开放项目项目教程 - 编程导航教程|19-API 开放平台问题答疑 - API 开放项目项目教程 - 编程导航教程]]